<?php
/*
* File：数据库操作类
* Author：亿泽
* QQ：1260435972
* Q群：557649112
*/
/**
 * 作者：亿泽
 * QQ：1260435972
 * 交流群：557649112
 * 日期：2022/03/31
 * 项目名称：亿泽不用验证系统
 * 项目说明：请勿进行违法用途，当您在使用本项目中的任何源代码时默认同意作者的观点！
 * 观点：
 * 1.禁止将本系统使用于违法违规用途。
 * 2.禁止将本系统使用包含但不限于 灰色产业/进行灰色产业的机器人插件/框架。
 * 3.禁止进行商业性质的二创二开，仅授权免费个人使用
 * 4.本系统为免费/全开源项目，禁止进行任何商业活动 除非 获得作者授权！
 * 感谢：
 * 1.使用了 光年 后台模板
 * 2.参考了 网络上部分代码资料
 * 3.感谢各位的使用~
 **/
require_once 'db.config.php';

class Db
{
    //1.私有的静态属性
    private static $link;
    private $table_name;
    private $objdb;
    private $options;

    public function __construct ()
    {
        $this -> dbname = DB_NAME;
        $this -> user = DB_USER;
        $this -> password = DB_PASSWD;
        $this -> port = DB_PORT;
        $this -> type = DB_TYPE;
        $this -> host = DB_HOST;
        $this -> dsn = "$this->type:host=$this->host;dbname=$this->dbname";
        $this -> options = [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ,//设置错误模式
            PDO::ATTR_CASE => PDO::CASE_NATURAL ,//设置数据库字段保持不变
            PDO::ATTR_EMULATE_PREPARES => TRUE ,//启用pdo模拟功能
            PDO::ATTR_PERSISTENT => TRUE//启用持久性连接
        ];
        try {
            //实例化pdo对象
            $this -> objdb = new PDO($this -> dsn , $this -> user , $this -> password , $this -> options);
            ;
            //            		echo '连接成功';
        } catch (PDOException $e) {
            //抛出异常
            die('ERROR:' . $e -> getMessage ());
        }

        return $this -> objdb;

    }

    //静态公共接口
    public static function getInstance ()
    {
        if (!(self ::$link instanceof self)) {
            self ::$link = new self();
        }
        return self ::$link;
    }

    //返回数据库实例对象
    public static function table ($table_name , $val = FALSE)
    {
        $link = self ::getInstance ();
        if (!defined ('DB_PRE') or DB_PRE == '') {
            if ($val) {
                $link -> table_name = "`$table_name` $val";
            } else {
                $link -> table_name = "`$table_name`";
            }
        } else {
            if ($val) {
                $link -> table_name = "`" . DB_PRE . "$table_name` $val";
            } else {
                $link -> table_name = "`" . DB_PRE . "$table_name`";
            }
        }
        return $link;
    }

    /**
     * 返回个数
     * $where = 限制语句
     */
    public function countnum ($where = "")
    {
        $link = $this -> table_name;
        if ($where == '') {
            $rows = self ::getInstance () -> objdb -> query ("SELECT count(*) from $link") -> fetch ();
            return $rows[0];
        } else {
            $rows = self ::getInstance () -> objdb -> query ("SELECT count(*) from $link where $where") -> fetch ();
            return $rows[0];
        }
    }

    /**
     * 查询表数据
     * $field = 字段
     * $where = 限制语句
     */
    public function find ($field = "*" , $where = "")
    {
        $link = $this -> table_name;
        if ($where == '') {
            $rows = self ::getInstance () -> objdb -> query ("SELECT $field from $link");
            return $rows;
        } else {
            //echo "<br>SELECT $field from $link where $where<br>";
            $rows = self ::getInstance () -> objdb -> query ("SELECT $field from $link where $where");
            return $rows;
        }
    }

    /**
     * 查询的原始sql
     * $sql = sql语句
     */
    public function rawfind ($sql = '')
    {
        if ($sql == '') {
            return 'sql 不可为空！！';
        } else {
            $rows = self ::getInstance () -> objdb -> query ("$sql");

            return $rows;
        }
    }
    /**
     * 执行一次原始sql
     * $sql = sql语句
     * 返回 受影响行数
     */
    public function rawexec($sql = '')
    {
        if ($sql == '') {
            return 'sql 不可为空！！';
        } else {
            //echo "<br>【SQL】 $sql<br>";
            $rows = self ::getInstance () -> objdb -> exec ("$sql");
            return $rows;
        }
    }
    /** 字符串转义 **/
    public function quote ($str)
    {
        return $this -> objdb -> quote ($str);
    }
}